package com.fang.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fang.entity.User;
import com.fang.utils.PaymentUtil;

public class PaymoneyServlet extends BaseServlet {
	
	public void pay(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//判断用户是否登录
		User user = (User) req.getSession().getAttribute("loginuser");
		if(user==null){
			resp.sendRedirect(req.getContextPath()+"/login.jsp");
			return;
		}
		
		String orderid = req.getParameter("orderid");
		String money = req.getParameter("money");
		String pd_FrpId = req.getParameter("pd_FrpId");
		// 根据易宝接口 准备参数
		/**
		 * 生成hmac方法
		 * @param p0_Cmd 业务类型
		 * @param p1_MerId 商户编号
		 * @param p2_Order 商户订单号
		 * @param p3_Amt 支付金额
		 * @param p4_Cur 交易币种
		 * @param p5_Pid 商品名称
		 * @param p6_Pcat 商品种类
		 * @param p7_Pdesc 商品描述
		 * @param p8_Url 商户接收支付成功数据的地址
		 * @param p9_SAF 送货地址
		 * @param pa_MP 商户扩展信息
		 * @param pd_FrpId 银行编码
		 * @param pr_NeedResponse 应答机制
		 * @param keyValue 商户密钥
		 * @return
		 */
		String p0_Cmd = "Buy";
		String p1_MerId = "10001126856"; // 商家编号  10001126856
		String p2_Order = orderid; // 订单号
		String p3_Amt = "0.01"; // 金额,单位是元    实际金额根据后台计算
		String p4_Cur = "CNY";

		String p5_Pid = "";
		String p6_Pcat = "";
		String p7_Pdesc = "";
		// 支付成功回调地址 ---- 第三方支付公司会访问、用户访问
		// 第三方支付可以访问网址
		// 第二次通知：需要独立外网网卡,本处http://p69w8f.natappfree.cc是由natapp软件内网穿透生成
		String p8_Url = "http://p69w8f.natappfree.cc"+
				req.getContextPath()+"/paymoney?method=callback"; // 回调地址
		String p9_SAF = "";
		String pa_MP = "";
		String pr_NeedResponse = "1";

		//加密算法 由支付公司提供：注册时，第三方支付平台提供给商家的加密算法的摘要
		String keyValue = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl"; // 密钥
		
		// 将所有数据，进行数字签名 ，
		String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order, p3_Amt, p4_Cur, p5_Pid, p6_Pcat,
					p7_Pdesc, p8_Url, p9_SAF, pa_MP, pd_FrpId, pr_NeedResponse, keyValue);

		// 将所有数据 发送易宝指定地址
		req.setAttribute("pd_FrpId", pd_FrpId);
		req.setAttribute("p0_Cmd", p0_Cmd);
		req.setAttribute("p1_MerId", p1_MerId);
		req.setAttribute("p2_Order", p2_Order);
		req.setAttribute("p3_Amt", p3_Amt);
		req.setAttribute("p4_Cur", p4_Cur);
		req.setAttribute("p5_Pid", p5_Pid);
		req.setAttribute("p6_Pcat", p6_Pcat);
		req.setAttribute("p7_Pdesc", p7_Pdesc);
		req.setAttribute("p8_Url", p8_Url);
		req.setAttribute("p9_SAF", p9_SAF);
		req.setAttribute("pa_MP", pa_MP);
		req.setAttribute("pr_NeedResponse", pr_NeedResponse);
		req.setAttribute("hmac", hmac);

		// 跳转确认支付页面
		req.getRequestDispatcher("/confirm.jsp").forward(req, resp);
	}


	public void callback(HttpServletRequest request, HttpServletResponse resp)
			throws ServletException, IOException {
		/**
		 * 返回校验hmac方法
		 * @param hmac 支付网关发来的加密验证码
		 * @param p1_MerId 商户编号
		 * @param r0_Cmd 业务类型
		 * @param r1_Code 支付结果
		 * @param r2_TrxId 易宝支付交易流水号
		 * @param r3_Amt 支付金额
		 * @param r4_Cur 交易币种
		 * @param r5_Pid 商品名称
		 * @param r6_Order 商户订单号
		 * @param r7_Uid 易宝支付会员ID
		 * @param r8_MP 商户扩展信息
		 * @param r9_BType 交易结果返回类型
		 * @param keyValue 密钥
		 * @return
		 */
		// 校验，易宝数字签名
		String p1_MerId = request.getParameter("p1_MerId");
		String r0_Cmd = request.getParameter("r0_Cmd");
		String r1_Code = request.getParameter("r1_Code");
		String r2_TrxId = request.getParameter("r2_TrxId");
		String r3_Amt = request.getParameter("r3_Amt");
		String r4_Cur = request.getParameter("r4_Cur");
		String r5_Pid = request.getParameter("r5_Pid");
		String r6_Order = request.getParameter("r6_Order");
		String r7_Uid = request.getParameter("r7_Uid");
		String r8_MP = request.getParameter("r8_MP");
		String r9_BType = request.getParameter("r9_BType");
		String rb_BankId = request.getParameter("rb_BankId");
		String ro_BankOrderId = request.getParameter("ro_BankOrderId");
		String rp_PayDate = request.getParameter("rp_PayDate");
		String rq_CardNo = request.getParameter("rq_CardNo");
		String ru_Trxtime = request.getParameter("ru_Trxtime");
		String hmac = request.getParameter("hmac");
		// 将响应所有数据加密，比较hmac
		String keyValue = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
		boolean isvalid = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd, r1_Code, r2_TrxId, r3_Amt, 
				r4_Cur, r5_Pid, r6_Order, r7_Uid, r8_MP, r9_BType, keyValue);
		if (isvalid) {
			// 区分两次通知处理方式
			// 第一次通知：浏览器重定向
			if (r9_BType.equals("1")) {
				// 给用户提示 付款成功， 查看付款结果
				System.out.println("收到1， 提示用户 ，已经付款");
				resp.setContentType("text/html;charset=utf-8");
				resp.sendRedirect(request.getContextPath() + "/pay_success.jsp");
			} 
			// 第二次通知：服务器点对点的形式
			else if (r9_BType.equals("2")) {
				// 收到易宝 到款通知， 修改订单状态
				System.out.println("收到2 ， 修改订单状态....");
				//response.getWriter().write("success");
				resp.sendRedirect(request.getContextPath() + "/orders?method=paysuccess&id="+r6_Order);
			}
		}else {
			throw new RuntimeException("数字签名错误，假冒易宝！");
		}
	}
		
	
}